﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>


//左移操作符
//int main()
//{
//	int num = 10;
//	//00000000000000000000000000001010
//	int n = num << 1;
//	//00000000000000000000000000010100   20
//	printf("n= %d\n", n);
//	printf("num= %d\n", num);
//	return 0;
//}


//右移操作符
//int main()
//{
//	int num = 10;
//	//00000000000000000000000000001010
//	int n = num >> 1;
//	//00000000000000000000000000000101  5
//	printf("n= %d\n", n);
//	printf("num= %d\n", num);
//	return 0;
//}

//位操作符：& 、 | 、 ^ 、~
//int main()
//{
//	int num1 = -3;
//	int num2 = 5;
//	printf("%d\n", num1 & num2);
//	//10000000000000000000000000000011 -3的原码
//	//11111111111111111111111111111100 -3的反码
//	//11111111111111111111111111111101 -3的补码
//	//00000000000000000000000000000101  5
//	//00000000000000000000000000000101  num1 & num2 = 5
//	printf("%d\n", num1 | num2);
//	//10000000000000000000000000000011 -3
//	//11111111111111111111111111111100 -3的反码
//	//11111111111111111111111111111101 -3的补码
//	//00000000000000000000000000000101  5
//	//11111111111111111111111111111101  num1 | num2 的补码
//	//10000000000000000000000000000011  num1 | num2 = -3
//	printf("%d\n", num1 ^ num2);
//	//10000000000000000000000000000011 -3
//	//11111111111111111111111111111100 -3的反码
//	//11111111111111111111111111111101 -3的补码
//	//00000000000000000000000000000101  5
//	//11111111111111111111111111111000  num1 ^ num2补码
//	//10000000000000000000000000001000  num1 ^ num2 = -8
//	printf("%d\n", ~0);
//	//00000000000000000000000000000000   0
//	//10000000000000000000000000000001   ~0 = -1
// 	return 0;
//}

//不能创建临时变量（第三个变量），实现两个整数的交换。
//int main() {
	    /*方法一：*/
	//int a = 10;
	//int b = 20;
	//printf("%d %d\n", a, b);
	//a = a + b;
	//b = a - b;
	//a = a - b;
	//printf("%d %d\n", a, b);
	     /*方法二*/
//	int a = 10;
//	int b = 20;
//	printf("%d %d\n", a, b);
//	a = a ^ b;
//	b = a ^ b;
//	a = a ^ b;
//	printf("%d %d\n", a, b);
//	return 0;
//}

//编写代码实现：求⼀个整数存储在内存中的⼆进制中1的个数。
//int main() {
//		/*方法一*/
//		int n = 0;
//		int count = 0;
//		scanf("%d", &n);
//		for (int i = 0; i < 32; i++) {
//			if (n & (1 << i))
//				count++;
//		}
//		printf("%d", count);
//		return 0;
//	}
//		/*方法二*/
//	int n = 0;
//	int count = 0;
//	scanf("%d", &n);
//	while (n) {
//		count++;
//		n = n & (n - 1);
//		//00000000000000000000000000000101  5
//		//00000000000000000000000000000100  4
//		//00000000000000000000000000000100  
//		//00000000000000000000000000000011  3
//		//00000000000000000000000000000000  0
//	}
//	printf("%d", count);
//	return 0;
//}


//将13⼆进制序列的第5位修改为1，然后再改回0
//int main()
//{
//	int a = 13;
//	a = a | (1 << 4);
//	printf("a = %d\n", a);
//	a = a & ~(1 << 4);
//	printf("a = %d\n", a);
//	return 0;
//

//在一个整型数组中，只有一个数字出现一次，其他数组都是成对出现的，请找出那个只出现一次的数字。
//int Func(int arr[], int len) {
//	int ret = 0;
//	for (int i = 0; i < len; i++) {
//		ret = ret ^ arr[i];
//	}
//	return ret;
//}
//
//int main() {
//	int arr[] = { 1,2,3,4,5,1,2,3,4 };
//	int len = sizeof(arr) / sizeof(arr[0]);
//	printf("%d", Func(arr, len));
//	return 0;
//}


//打印整数二进制的奇数位和偶数位
//void Func2(int n) {
//	for (int i = 30; i >= 0; i -= 2) {
//		printf("%d ", (n >> i) & 1);
//	}
//	printf("\n");
//	for (int i = 31; i >= 1; i -= 2) {
//		printf("%d ", (n >> i) & 1);
//	}
//	printf("\n");
//}
//
//int main() {
//	int n = 0;
//	scanf("%d", &n);
//	Func2(n);
//	return 0;
//}

//求两个数二进制中不同位的个数
int Func3(int m, int n) {
	int ret = m ^ n;
	int count = 0;
	while (ret) {
		ret = ret & (ret - 1);
		count++;
	}
	return count;
}

int main() {
	printf("%d", Func3(5, 10));
	return 0;
}